#ifndef ENGINE_WINDOW_INTERFACE_H__
#define ENGINE_WINDOW_INTERFACE_H__

#include "WindowSettings.h"
#include <map>

/**
 * Janela usada para renderização da cena e tratamento de inputs do jogo.
 *
 * @see JanelaFactory
 */
class WindowInterface
{
public:

	/**
	 * Listagem dos códigos autoexplicativos de teclas usados para tratamento de eventos.
	 * Útil para adaptar diferentes sistemas, pois o código do Windows é diferente
	 * dos códigos do Linux/X11.
	 */
	enum KeyCode
	{
		KEYBOARD_UP,
		KEYBOARD_DOWN,
		KEYBOARD_LEFT,
		KEYBOARD_RIGHT,
		KEYBOARD_SPACE,
		KEYBOARD_ESC,
		KEYBOARD_ENTER
	};

	/**
	 * Construtor.
	 */
	WindowInterface(const WindowSettings& settings );

	/**
	 * Destrutor: é importante que seja virtual, pois essa classe é abstrata
	 */
	~WindowInterface(void);


	/**
	 * Inicia o laço de renderização e de tratamento de eventos dessa janela
	 */
	virtual void startRendering(void) = 0;

	/**
	 * Retorna true se, e apenas se a tecla recebida como argumento está pressionada.
	 */
	virtual bool isKeyDown( WindowInterface::KeyCode key );

	/**
	 * Redimensiona a janela
	 * @param width  Nova largura da janela, em pixels
	 * @param height Nova altura da janela, em pixels
	 */
	virtual void resize( int width, int height);

	/**
	 * Troca os buffers, forçando o OpenGL a exibir o resultado do quadro.
	 */
	virtual void swapBuffers(void) = 0;

protected:

	typedef ::std::map< WindowInterface::KeyCode,bool> KeyCodeMap;

	/// Configurações dessa janela
	WindowSettings settings;
	/// Mapa com as teclas do motor
	KeyCodeMap keyMap;
};


#endif /* ENGINE_WINDOW_INTERFACE_H__ */
